from decimal import Decimal

from django.shortcuts import render
from django_redis import get_redis_connection
from rest_framework.generics import CreateAPIView
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.views import APIView
from .serializers import OrderSettlementSerializer, OrderCommitSerializer
from goods.models import SKU


class OrderSettlementView(APIView):
    """
    GET /orders/places/
    1. 验证是否是登陆用户；
    2. 从redis_cart 里取出购物车数据， 和是否选中数据
    3. 把选中商品的数量从购物车数据取出
    4. 根据用户选中商品id 从数据库查找除对应商品信息（商品名称， 单价， url）
    5. 运费
    """
    # 必须是登陆用户才能访问
    permission_classes = (IsAuthenticated,)

    def get(self, request):
        user = request.user
        # 取出要结算的商品
        redis_conn = get_redis_connection('cart')
        redis_cart = redis_conn.hgetall('cart_%s' % user.id)
        cart_selected = redis_conn.smembers('cart_selected_%s' % user.id)

        cart = {}
        # 从redis里找出巡中的商品和选中商品的数量
        for sku_id in cart_selected:
            cart[int(sku_id)] = int(redis_cart[sku_id])
        # 从发数据库查询上平信息
        skus = SKU.objects.filter(id__in=cart.keys())
        # 把商品的数量信息加到sku中， 然后用sku的序列化器输出
        for sku in skus:
            sku.count = cart[sku.id]
        # 运费， Decimal， 保证书完整， 避免除不尽时产生数据差 100 ！= 33.33 + 33.33 + 33.33
        freight = Decimal('10.00')
        serializer = OrderSettlementSerializer({'freight': freight, 'skus': skus})
        return Response(serializer.data)


# 点击结算， 保存订单
class OrderView(CreateAPIView):
    """
    保存订单
    POST /orders/
    登录用户
    1. 用户点击结算， 前端发送收货地址和支付方式过来， 商品信息在redis里， 前段不传（传来也不用）
    """
    permission_classes = [IsAuthenticated]
    serializer_class = OrderCommitSerializer







